/**
 * 添加拦截器:
 *   拦截 request 请求
 *   拦截 uploadFile 文件上传
 *
 * TODO:
 *   1. 非 http 开头需拼接地址
 *   2. 请求超时
 *   3. 添加小程序端请求头标识
 *   4. 添加 token 请求头标识
 */

import { useMemberStore } from '@/stores'

// const baseURL = 'http://192.168.2.133:443'
// const baseURL = 'https://d1.miplus.cn/huidaapicn'
const baseURL = 'https://assistant-qa.huidait.com'
// const baseURL = 'https://assistant-dev.huidait.com'
const fileURL = 'https://opt-dev.huidait.com'
// 添加拦截器
const httpInterceptor = {
  // 拦截前触发
  invoke(options : UniApp.RequestOptions) {
    // 2. 请求超时, 默认 60s
    options.timeout = 60 * 1000;
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'saas-proappcode': '06302',
      'saas-Agent': 'qj-wemini',
      'saas-tenantcode': '728243877368496147',
    }
    // 4. 添加 token 请求头标识
    const memberStore = useMemberStore()
    const token = memberStore.profile?.ticketTokenid
    if (token) {
      options.header['saas-token'] = token
    }

    options.header['content-type'] = 'application/x-www-form-urlencoded'
    // else if (!token && options.url !== '/auth/login') {
    //   uni.reLaunch({ url: '/pages/login/login' })
    //   return false
    // }
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
  },
}
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

/**
 * 请求函数
 * @param  UniApp.RequestOptions
 * @returns Promise
 *  1. 返回 Promise 对象
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型，支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 清理用户信息，跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */
type Data<T> = {
  errorCode ?: string,
  msg : string,
  dataObj : T,
  success : boolean,
  sysRecode : string
}
// 2.2 添加类型，支持泛型
export const http = <T>(options : UniApp.RequestOptions) => {

  // 1. 返回 Promise 对象
  return new Promise<Data<T>>((resolve, reject) => {

    uni.request({
      ...options,
      // 响应成功
      success(res : any) {
        console.log(options.url)
        console.log(res)
        // 状态码 2xx， axios 就是这样设计的
        if (res.statusCode == 200) {
          // 2.1 提取核心数据 res.data
          if (options.url.includes('loginIn.json')) {
            //登录
            const { success, errorCode, dataObj, msg } = res.data;
            if (success) {
              resolve(dataObj)
            } else if (errorCode == 401) {
              // token失效 -> 根据后端错误信息轻提示
              uni.showToast({
                icon: 'error',
                title: msg || '登录验证已过期，请重新登录',
              })
              uni.reLaunch({ url: '/pages/login/login' })
              reject(res)
            } else {
              // 其他错误 -> 根据后端错误信息轻提示
              uni.showToast({
                icon: 'error',
                title: msg || '请求错误',
              })
              reject(res)
            }
          } else {
            console.log(res.data)
            if (res.data.errorCode == 'nologin') {
              // token失效 -> 根据后端错误信息轻提示
              uni.showToast({
                icon: 'error',
                title: msg || '登录验证已过期，请重新登录',
              })
              uni.reLaunch({ url: '/pages/login/login' })
              reject(res)
            } else if (res.data.errorCode == '-1'){
             uni.showToast({
               icon: 'none',
               title: res.data.msg,
             })
            } else {
               resolve(res.data)
            }
          }


        } else if (res.statusCode === 401) {
          // 401错误  -> 清理用户信息，跳转到登录页
          const memberStore = useMemberStore()
          memberStore.clearProfile()
          uni.reLaunch({ url: '/pages/login/login' })
          reject(res)
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: 'error',
            title: res?.errMsg || '请求错误',
          })
          reject(res)
        }
      },
      // 响应失败
      fail(err) {
        console.log('error')
        uni.showToast({
          icon: 'none',
          title: '网络错误，换个网络试试',
        })
        reject(err)
      },
      complete() {
        console.log('complete')
      }
    })
  })
}

// 文件上传基础URL
export const getUploadURL = (params : string) => `${baseURL}/file/upload${params}`

export { baseURL,fileURL}
